﻿using System;

namespace System
{
	/// <summary>
	/// <see cref="TypeCode"/> 的帮助类。
	/// </summary>
	/// <remarks>
	/// 本帮助类体提供的各 <see cref="TypeCode"/> 默认值不完全与操作系统默认分配的值相同，如：
	/// <list type="">
	///		<item>TypeCode.DBNull：.Net Framework 默认分配 Null，而本类提供的值为 DBNull.Value 。</item>
	///		<item>TypeCode.String：.Net Framework 默认分配 Null，而本类提供的值为 String.Empty 。</item>
	/// </list>
	/// </remarks>
	[CLSCompliant(false)]
	public class TypeCodeUtility
	{
		/// <summary>
		/// TypeCode.Boolean 的默认值 False 。
		/// </summary>
		public const bool BooleanDefault = false;
		/// <summary>
		/// TypeCode.Byte 的默认值 0 。
		/// </summary>
		public const byte ByteDefault = 0;
		/// <summary>
		/// TypeCode.Char 的默认值 空格 。
		/// </summary>
		public const char CharDefault = ' ';
		/// <summary>
		/// TypeCode.DateTime 的默认值 DateTime.MinValue 。
		/// </summary>
		public static readonly DateTime DateTimeDefault = DateTime.MinValue;
		/// <summary>
		/// TypeCode.DBNull 的默认值 DBNull.Value（.Net Framework 默认分配 Null）。
		/// </summary>
		public static readonly DBNull DBNullDefault = DBNull.Value;
		/// <summary>
		/// TypeCode.Decimal 的默认值 0 。
		/// </summary>
		public const decimal DecimalDefault = 0;
		/// <summary>
		/// TypeCode.Double 的默认值 0 。
		/// </summary>
		public const double DoubleDefault = 0;
		/// <summary>
		/// TypeCode.Int16 的默认值 0 。
		/// </summary>
		public const short Int16Default = 0;
		/// <summary>
		/// TypeCode.Int32 的默认值 0 。
		/// </summary>
		public const int Int32Default = 0;
		/// <summary>
		/// TypeCode.Int64 的默认值 0 。
		/// </summary>
		public const long Int64Default = 0;
		/// <summary>
		/// TypeCode.SByte 的默认值 0 。
		/// </summary>
		public const sbyte SByteDefault = (sbyte)0;
		/// <summary>
		/// TypeCode.Single 的默认值 0 。
		/// </summary>
		public const Single SingleDefault = 0;
		/// <summary>
		/// TypeCode.String 的默认值 String.Empty（.Net Framework 默认分配 Null）。
		/// </summary>
		public static readonly string StringDefault = String.Empty;
		/// <summary>
		/// TypeCode.UInt16 的默认值 0 。
		/// </summary>
		public const ushort UInt16Default = (ushort)0;
		/// <summary>
		/// TypeCode.UInt32 的默认值 0 。
		/// </summary>
		public const uint UInt32Default = (uint)0;
		/// <summary>
		/// TypeCode.UInt64 的默认值 0 。
		/// </summary>
		public const ulong UInt64Default = (ulong)0;

		#region GetDefaultValue 获取指定 TypeCode 的默认值

		/// <summary>
		/// 获取指定 <see cref="TypeCode"/> 的默认值。
		/// </summary>
		/// <param name="typeCode"></param>
		/// <returns></returns>
		public static object GetDefaultValue(TypeCode typeCode)
		{
			switch (typeCode)
			{
				case TypeCode.Boolean:
					return BooleanDefault;

				case TypeCode.Byte:
					return ByteDefault;

				case TypeCode.Char:
					return CharDefault;

				case TypeCode.DateTime:
					return DateTimeDefault;

				case TypeCode.DBNull:
					return DBNullDefault;

				case TypeCode.Decimal:
					return DecimalDefault;

				case TypeCode.Double:
					return DoubleDefault;

				case TypeCode.Int16:
					return Int16Default;

				case TypeCode.Int32:
					return Int32Default;

				case TypeCode.Int64:
					return Int64Default;

				case TypeCode.SByte:
					return SByteDefault;

				case TypeCode.Single:
					return SingleDefault;

				case TypeCode.String:
					return StringDefault;

				case TypeCode.UInt16:
					return UInt16Default;

				case TypeCode.UInt32:
					return UInt32Default;

				case TypeCode.UInt64:
					return UInt64Default;

				default:
					return null;
			}
		}

		#endregion
	}
}
